package com.example.administrator.privatetest.activity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;

import com.example.administrator.privatetest.R;
import com.example.administrator.privatetest.adapter.MyAdapter;
import com.example.administrator.privatetest.util.Globals;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class MainActivity extends AppCompatActivity {

    //界面ListView
    private ListView listView;
    //顶部的显示路径
    private TextView nowPath;

    //设置一个放map的集合
    private List<Map<String ,Object>> values;
    //初始化自定义Adapter
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Globals.init(this);
        setContentView(R.layout.activity_main);

        //初始化顶部路径和listView
        nowPath = (TextView) findViewById(R.id.now_path);
        listView = (ListView) findViewById(R.id.listView);

        //读取SD卡
        File sd = Environment.getExternalStorageDirectory();
        //加载sd卡数据
        loadFile(sd);

        //初始化values容器和适配器，用values 来接受数据
        values = new ArrayList<>();
        adapter = new MyAdapter(MainActivity.this,values);
        listView.setAdapter(adapter);//关联适配器

        //设置listView的点击事件
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                //获取所点击行的数据,此时map已经具备了所有信息
                Map<String,Object> map = values.get(position);

                boolean isDir = (boolean) map.get("isDir");
                //想读取文件
                File file = new File(map.get("fullPath").toString());
                if(isDir){
                    values.clear();//如果是文件夹，清空这层的values数据
                    if(!Environment.getExternalStorageDirectory().getAbsolutePath().
                            equals(file.getAbsolutePath())){
                        Map<String,Object> parentDate = new HashMap<String, Object>();
                        parentDate.put("fileName","返回上一级");
                        parentDate.put("isDir",true);//设定是文件夹
                        parentDate.put("extName","open_dir");//设置图片是“打开”的图片
                        parentDate.put("fullPath",file.getParent());//设置它的全路径是它的上级目录
                        parentDate.put("real","TRUE");//自定义标签给后面用,做返回键时用
                        values.add(parentDate);//放到values中
                    }
                    loadFile(file);//加载file文件下的数据
                    adapter.notifyDataSetChanged();//刷新数据
                }else {
                    //如果是文件，则读取数据,利用builder弹窗来提示一下，相当于吐司，只是还要点击确定
                    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                    builder.setTitle("文件信息");
                    builder.setMessage("文件名:"+file.getName()+"\n\r"+"文件大小:"+file.length());
                    builder.setNegativeButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            //什么都不写，点击后自动关闭
                        }
                    });
                    builder.create().show();//最后的show()
                }
            }
        });


        //长按删除文件
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {

                Map<String,Object> map = values.get(i);//获取点击行的信息
                boolean isDir = (boolean) map.get("isDir");
                if(isDir){
                    final File file = new File(map.get("fullPath").toString());

                    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                    builder.setTitle("提示窗口");
                    builder.setMessage("您确定要删除（"+file.getName()+"）吗？");
                    builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            file.delete();
                            values.remove(i);
                            adapter.notifyDataSetChanged();//刷新操作
                        }
                    });
                    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {

                        }
                    });
                    builder.create().show();
                }


                return false;
            }
        });

    }

    /**
     * 加载文件中数据
     * @param f
     */
    private void loadFile(File f) {
        //获取f下的所有文件和文件夹
        File [] fs = f.listFiles();
        //遍历并添加数据
        nowPath.setText("当前的文件位置是"+f.getAbsolutePath());
        for(int i =0;i<fs.length;i++){
            File file = fs[i];//对任意的文件file
            String fileName = file.getName();//获取文件名

            Map<String ,Object> map = new HashMap<>();//大量的使用map
            map.put("fileName",fileName);//放入文件名
            map.put("fullPath",file.getAbsolutePath());//放入文件路径

            if(file.isDirectory()){//判断是否为文件夹
                map.put("extName","close_dir");//设置图片形式
                map.put("isDir",true);//设置自定义的方式，之后只要用键"isDir"就可以判断
                                    // 是否是文件夹了，很巧妙的方法
            }else{
                //如果不是文件夹，就截取这个文件的不带扩展名的名称
                map.put("extName",fileName.substring(fileName.lastIndexOf(".")+1).toLowerCase());
                map.put("isDir",false);//同时设定不是文件夹用false
            }
            values.add(map);//将这个map 放到values中
        }
    }


    //使用返回键返回的逻辑
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK){//说明按的是返回键
            //返回过程中要根据首行文件是否是“返回上一级”来判断是否到了根目录下面
            Map<String,Object> map = values.get(0);
            if("TRUE".equals(map.get("real"))){//能看到“返回上一级”，说明还没到根目录下
                //下面这个操作没明白
                listView.performItemClick(listView.getChildAt(0),0,listView.getChildAt(0).getId());
            }else {//到了根目录下，使用了返回键
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle("提示窗口");
                builder.setMessage("亲，真的要离开吗？");
                builder.setPositiveButton("离开", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        //终止程序
                        finish();
                    }
                });
                builder.setNegativeButton("暂不", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                    }
                });
                builder.create().show();//这个不能忘
            }
        }
        return super.onKeyDown(keyCode, event);

    }
}
